package dynamicproxy;



/**
 * @projectName: com.xiayuanxing.designPattern
 * @className: Client
 * @author: xiayuanxing
 * @description: 动态代理
 * @date: 2022/1/3 11:08
 * @version: 1.0
 */
public class Client {

    //动态代理模式的基本介绍:
    // 1)代理对象,不需要实现接口，但是目标对象要实现接口，否则不能用动态代理
    // 2)代理对象的生成，是利用JDK的API，动态的在内存中构建代理对象
    // 3)动态代理也叫做：JDK代理、接口代理

    //JDK中生成代理对象的API:
    // 1)代理类所在包:java.lang.reflect.Proxy
    // 2)JDK实现代理只需要使用newProxyInstance方法,但是该方法需要接收三个参数,
    // 完整的写法是:static Object newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler h)

    public static void main(String[] args) {

        //创建目标对象
        ITeacherDao target = new TeacherDao();

        //给目标对象，创建代理对象,可以转成ITeacherDao
        ITeacherDao proxyInstance = (ITeacherDao)new ProxyFactory(target).getProxyInstance();

        //proxyInstance=classcom.sun.proxy.$Proxy0内存中动态生成了代理对象
        System.out.println("proxyInstance="+proxyInstance.getClass());

        //通过代理对象，调用目标对象的方法
        proxyInstance.teach();
        proxyInstance.sayHello("Tom");

    }
}
